import json
import os

import ddddocr
import matplotlib.pyplot as plt
from fontTools.pens.freetypePen import FreeTypePen
from fontTools.ttLib import TTFont
from tqdm import tqdm


# 用 ddddocr 识别图片文字,保存至 imgs_copy_word 文件夹
def ocr_words(imgs_path='resource/imgs', json_name='resource/ocr_dddd.json'):
    """
    从指定的图片文件夹中识别文字，并将结果保存为JSON文件。

    参数:
    imgs_path: 图片文件夹路径，默认为'resource/imgs'。
    json_name: 保存的JSON文件名，默认为'resource/ocr_dddd.json'。

    返回:
    无返回值，直接将识别结果保存为JSON文件。
    """
    # 初始化OCR识别器，用于后续的文字识别
    ocr = ddddocr.DdddOcr(beta=False, show_ad=False)
    # 初始化一个字典，用于存储图片名和识别出的文字
    word_map = {}
    # 使用tqdm显示进度条，遍历图片文件夹中的所有图片
    with tqdm(total=len(os.listdir(imgs_path)), desc='正在识别文字', unit='个') as pbar:
        for parent, dirnames, filenames in os.walk(imgs_path):
            for filename in filenames:
                # 提取图片文件名的前缀，作为识别结果的键
                k = filename.split('.')[0]
                # 构建图片的完整路径
                current_path = os.path.join(parent, filename)
                # 读取图片二进制数据
                with open(current_path, 'rb') as f:
                    image = f.read()
                # 使用OCR识别图片中的文字
                res = ocr.classification(image)
                # 如果识别结果为空，则设置为'未找到'
                if len(res) == 0:
                    res = '未找到'
                # 如果识别结果有多个，只取第一个
                if len(res) > 1:
                    res = res[0]
                # 将识别结果存入字典
                word_map[k] = res
                # 更新进度条
                pbar.update(1)
    # 如果识别结果字典不为空，则将其保存为JSON文件
    if word_map:
        with open(json_name, 'w', encoding='utf-8') as f:
            # 将字典内容转换为JSON字符串，并写入文件
            f.write(json.dumps(word_map, ensure_ascii=False))


# 拆解woff2文件，保存为单个字体图片:保存至 imgs 文件夹
def font_split_single_img(font_path='resource/fonts', imgs_path='resource/imgs'):
    """
    分离字体文件中的每个字符，并保存为图像。

    本函数遍历指定的字体文件目录，对于每个字体文件，提取其包含的每个字符或符号，
    并将其保存为单独的图像文件。这在字体分析、字符识别预处理等场景中非常有用。

    参数:
    - font_path: 字体文件目录路径，默认为'resource/fonts'。
    - imgs_path: 保存图像的目录路径，默认为'resource/imgs'。
    """
    # 遍历字体文件目录
    for parent, dirnames, filenames in os.walk(font_path):
        for filename in filenames:
            # 解析字体文件
            font = TTFont(os.path.join(parent, filename))  # woff2文件
            cmap = font.getBestCmap()
            index = 1
            # 对每个字符进行处理并保存为图像
            with tqdm(total=len(cmap), desc='正在拆解字体文件', unit='个') as pbar:
                for n, v in cmap.items():
                    glyph = font.getGlyphSet()[v]  # 通过字形名称选择某一字形对象
                    pen = FreeTypePen(None)  # 实例化Pen子类
                    glyph.draw(pen)  # “画”出字形轮廓
                    b = pen.array()
                    plt.figure()
                    plt.imshow(b)
                    plt.axis('off')  # 禁用坐标轴
                    os.makedirs(imgs_path, exist_ok=True)
                    plt.savefig('./{0}/{1}.jpg'.format(imgs_path, n))
                    plt.clf()
                    plt.cla()
                    plt.close()
                    index += 1
                    pbar.update(1)
